#include "main.h"//test 2024.9.29   by He 123
#include <stdlib.h>

//*********定义变量***************//
//数码管亮度、数据、位置
u8 light=0,dat1=0,loc1=0;

unsigned char xdata key=0;//键码
unsigned char Function = 0; // 功能寄存器
unsigned char smgtimer_status=0;//数码管计时器的状态（开始/暂停）
  
unsigned char station=0; //工作状态
unsigned long  idata randomdata;

//unsigned char mylife=100,shu_jcq=0;//红外模式下的变量
//unsigned int idata myshu=0;
         
//SW1:  单击：开启/暂停LED
//      双击：关闭所有灯
//      长按：开启/关闭ws2812

//SW2:  单击：开启/暂停数码管计时
//      双击；切换数码管显示模式：0关闭，1常亮，2呼吸
//      长按：计时清零

//SW3:  单击：数码管流水
//      双击：播放/暂停音乐
//      长按：按键音
u8 SMG_mode_flag=0;//数码管功能标志位：0无，1计时(开始、暂停、清零)，2流水
u8 SMG_power_flag=1;//数码管开关标志位：0关闭，1常亮，2呼吸
bit SMG_clear_flag=0;//数码管清零标志位：0关闭，1清零

bit Music_flag=0;   //音乐播放/暂停标志位：0暂停，1播放
dlay delay0;
//********************************//
void main() //@12.000MHz
{
    init_delay(&delay0,1,1,0,0);//蜂鸣器delay初始化
    timer2_init(); //定时器2初始化
//    ired_init();
    Timer0_Init();//定时器0初始化
    buzzer_off();  // 初始化蜂鸣器，关闭蜂鸣器  
    WS2812_GPIO_Init();//ws2812的io口初始化，推挽输出,灯全灭
    
 while (1)  
    {    
          if(Function&0X20)
        {
                    
            if(Music_flag==0)
            {     HC595_send( ~(HC595_data &0x80));    
                 
            }
             
        }
            
     if(station==0)   
     {
        if(SMG_power_flag)//数码0关闭、非零打开
        {
            if(SMG_power_flag==1)//数码管常亮
               SMG_SHOW(100); 
            else
                SMG_SHOW(light);//数码管呼吸
        }
        if(Function&0x10)
        {
         LED_update(&led); 
        } 
     }


                   
    }
    
}
    


//Function 寄存器| 蜂鸣器总开关寄存器 0x80| 按键音寄存器 0x02| 数码管灯效寄存器 
//LED清除0x20 | LED 寄存器 0x10| ws2812 寄存器 0x01




void timer2_isr(void) interrupt 12	//定时器2中断函数
{
    static idata smg_time_s=0,smg_time_m=0;//数码管计时,秒，分
	TH2 = 0xFC;		//设置定时初始值//1ms
	TL2 = 0x18;		//设置定时初始值

    timer++;
    timeup(&delay0);
    

    
    if(Function&0x20) //双击sw
    {
         Function&=(~0x10);
    }
    
    
    
     if(Function&0x02&&Music_flag==0)  // 检测蜂鸣器状态
     {
        buzzer_timer(); 
     }

    if(Function&0x40 && (Music_flag==0) ) //寄存器0x40在 buzzer_timer和music开启或者关闭
      {
         buzzer();  // 反转蜂鸣器状态
      }

     if(timer%20==0 && station==0)   //20ms 执行一次  
    {       
       
         SGM_huxi();   //改变数码管亮度   

         if(Function&0x01) //2812寄存器 控制
        {
          ws2812_mod_1(1);
        }
        
         if(!(Function&0x01))
        {
           ws2812_mod_1(0);
           TurnOffWS2812B();
        }      
        
        
        if(Function&0x20)
         { 
           Function&=(~0x10);
           Function&=(~0x01);
             
           ws2812_mod_1(0);
           TurnOffWS2812B();
         }

         
         
         
        if(SMG_clear_flag)//清零数码管
        {
            if(SMG_mode_flag==1&&SMG_power_flag)//计时模式且非关闭数码管时，4位置零
            {
                smg_time_s=0;
                smg_time_m=0;
                SMG_Number(smg_time_s%10,4,0);
                SMG_Number(smg_time_s/10,3,0); 
                SMG_Number(smg_time_m%10,2,1);
                SMG_Number(smg_time_m/10,1,0);                
            }
            else//流水时4位置零后关闭数码管
            {
                SMG_Number(0,4,0);
                SMG_Number(0,3,0); 
                SMG_Number(0,2,0);
                SMG_Number(0,1,0);
                s0 = 1;s1 = 1;s2 = 1;s3 = 1;
            }
            SMG_clear_flag=0;
        }
    }   
    if( (timer%3==0) && (Function&0x10) && (station==0) )   //3ms 执行一次  
    {                 
        LEDCycle();   
    }   

    if(timer%10==0)        //10ms 执行一次  
   {      
      
          key=keylook();//获取键码

        switch(key)//判断键码
       {
           case 0:;break;//无按键按下
           case 1://单击sw1 LED呼吸流水/暂停
           if(station==0)    
           {
                if(!(Function&0x20))
                {
                if(Function&0x10)
                    {
                        buzzer_time_flag = 20;
                        Function&=(~0x10);     
                        
                    }
                    else
                    {
                        Function|=0x10;    //打开呼吸流水功能 
                        buzzer_time_flag = 20;
                    }    
                }     
             
            }
//            else //红外模式下的sw1
//            {
//                randomdata=(rand()%1000*timer)%255;
//                
//				
//			    mylife=100;
//	            buzzer_time_flag = 30;
//            }
                     
               ;break;
           case 2: 
               buzzer_time_flag = 30; SMG_mode_flag=1;smgtimer_status++;if(smgtimer_status>1)smgtimer_status=0//单击sw2//数码管计时开启、暂停
                 
               ;break;
           case 3:
               buzzer_time_flag = 30;SMG_mode_flag=2;//单击sw3//数码管流水、蜂鸣器翻转30次
               ;break;
               
           case 4:   //长按sw1 控制2812
               
            if(!(Function&0x20))
                {
                if(Function&0x01)
                    {
                    
                        Function&=(~0x01);     
                        buzzer_time_flag = 30;
                    }
                    else
                    {
                        Function|=0x01;    //打开呼吸流水功能 
                        buzzer_time_flag = 30;
                    }    
                }    


               ;break;

           case 5:SMG_clear_flag=1;buzzer_time_flag = 30;//长按sw2//管计时清零
               ;break;
           case 6:
                        
                 if(Function&0x02)
                    {
                        buzzer_time_flag = 30;
                        Function&=(~0x02);     
                      
                    }
                    else
                    {
                        Function|=0x02;    //打开呼吸流水功能 
                        buzzer_time_flag = 30;
                    }    
           
           //长按sw3//按键音打开关闭
               
                 
               
               ;break;
           case 7://双击sw1//led关
                  if(Function&0x20)
                 {
                 
                    Function&=(~0x20);   
                                         
                    buzzer_time_flag = 30;
                 }
                 else
                 {
                    Function|=0x20;    //灯关闭 
                    buzzer_time_flag = 30;
                     
                 }   
               ;break;
           case 8:buzzer_time_flag = 30;SMG_power_flag++;if(SMG_power_flag>2){SMG_power_flag=0;SMG_clear_flag=1;}//双击sw2//数码管,2呼吸、1常亮、0关闭
               ;break; 
           case 9://双击sw3//播放/暂停
                Music_flag=~Music_flag;
           break;
           default:break;
         }
    
     }

     



     if(timer%1000==0 &&(station==0))   //1000ms 执行一次  
     {   
        if(SMG_mode_flag==1)//处于计时器模式
        {
            SMG_Number(smg_time_s%10,4,0);
            SMG_Number(smg_time_s/10,3,0); 
            SMG_Number(smg_time_m%10,2,1);
            SMG_Number(smg_time_m/10,1,0);
            if(smgtimer_status)//开始计时，数值更新
            {
                if(++smg_time_s>=60)
                {smg_time_s=0;smg_time_m++;}
                if(smg_time_m>=60)smg_time_m=0;
            }       
            
        }            
     }  
     
       if(Music_flag)//音乐播放
        {
 
            if(timer%5==0)music_display(&delay0);//音乐播放
             
        }
        else//音乐停止
        {
            TR0=0;        //音乐关闭

            
        }
         
    timer%=5000;
  
    


}